<?php
// +----------------------------------------------------------------------
// | Bwsaas
// +----------------------------------------------------------------------
// | Copyright (c) 2015~2020 http://www.buwangyun.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Gitee ( https://gitee.com/buwangyun/bwsaas )
// +----------------------------------------------------------------------
// | Author: buwangyun <hnlg666@163.com>
// +----------------------------------------------------------------------
// | Date: 2020-9-28 10:55:00
// +----------------------------------------------------------------------

namespace app\manage\controller\member;

use app\common\model\WechatAuthInfo;
use buwang\base\MemberBaseController;
use buwang\util\wechat\WechatProgramHandle;

/**
 * 微信小程序相关接口
 */
class WechatProgramController extends MemberBaseController
{
    /**
     * 获取基本信息
     */
    public function getAccountBasicInfo()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;

        $res = WechatProgramHandle::getAccountBasicInfo($member_miniapp_id);
        return $this->success('success', $res);

    }

    /**
     * 小程序认证
     */
    public function mnAuth()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;
        $post = $this->request->post();

        if (!$post['customer_type'] || !$post['name'] || !$post['email'] || !$post['account_name'] || !$post['account_name_type']) {
            return $this->error('缺少必要参数');
        }
        if (!in_array($post['customer_type'], [1, 12, 15])) {
            return $this->error('类型不存在');
        }

        if (in_array($post['customer_type'], [1, 12])) {
            if (!isset($post['qualification']) || !$post['qualification']) {
                return $this->error('请上传主体资质材料');
            }
        }
        if ($post['customer_type'] == 15) {
            if (!isset($post['auth_identification']) || !$post['auth_identification']) {
                return $this->error('请选择个人身份');
            }
            if (!isset($post['auth_ident_material']) || !$post['auth_ident_material']) {
                return $this->error('请上传身份证明材料');
            }
            if (!is_array($post['auth_ident_material'])) {
                return $this->error('身份证明材料，必须是数组格式');
            }
        }

        //发票类型 1: 不开发票 2: 电子发票 3: ~~增值税专票~~（2024年4月3日起废弃） 4: 增值税专票（数电类型）
        $invoice_type = $post['invoice_type'];
        //小程序开发者自行支付
        if ($invoice_type == 2) {
            //需要发票
            $invoice_info = [
                'invoice_type' => $invoice_type,
                'electronic' => [//发票类型=2时必填 电子发票开票信息
                    'id' => $post['invoice_id'],//纳税识别号（15位、17、18或20位）
                    'desc' => $post['invoice_desc'] ?? '',//发票备注（选填）
                ]
            ];
        } else {
            //不需要发票
            $invoice_info = [
                'invoice_type' => $invoice_type,
            ];
        }

        //获取认证小程序信息
        $accountBasicInfo = WechatProgramHandle::getAccountBasicInfo($member_miniapp_id);
        $appid = $accountBasicInfo['appid'] ?? '';
        if (!isset($accountBasicInfo['errcode']) || $accountBasicInfo['errcode'] != 0 || !$appid) {
            $errmsg = $res['errmsg'] ?? '';
            return $this->error('获取小程序信息失败:' . $errmsg);
        }

        //根据$appid查询认证记录拦截
        $wechatAuthInfo = WechatAuthInfo::where('appid', $appid)->order('id desc')->limit(1)->find();
        if ($wechatAuthInfo) {
            if ($wechatAuthInfo['auth_status'] == 1) {
                return $this->error('正在认证审核，请勿重复提交');
            }
            if ($wechatAuthInfo['auth_status'] == 2) {
                return $this->error('已经认证通过');
            }
            if ($wechatAuthInfo['auth_status'] == 3) {
                return $this->error('认证失败，请编辑后在提交');
            }
        }

        ////称命中关键词-补充材料 media_id 支持jpg,jpeg .bmp.gif .png格式，支持上传多张图片
        $account_supplemental = $post['account_supplemental'] ?? [];
        //填了auth_identification则必填。身份证明材料 media_id （1）基于不同认证身份上传不同的材料；（2）认证类型=1时选填，支持上传10张图片（3）支持jpg,jpeg .bmp.gif .png格式
        $auth_ident_material = $post['auth_ident_material'] ?? [];
        //构建请求参数
        $params = [
            'auth_data' => [
                'customer_type' => $post['customer_type'],//企业为1，个体工商户 为12，个人是15
                'contact_info' => [
                    'name' => $post['name'],//认证联系人姓名
                    'email' => $post['email'],//认证联系人邮箱
                ],
                'invoice_info' => $invoice_info,//发票信息，如果是服务商代缴模式，不需要改参数
                'qualification' => $post['qualification'] ?? '',//非个人类型必填。主体资质材料 media_id 支持jpg,jpeg .bmp.gif .png格式，仅支持一张图片
                'qualification_other' => $post['qualification_other'] ?? [],//数组-主体资质其他证明材料 media_id 支持jpg,jpeg .bmp.gif .png格式，最多上传10张图片
                'account_name' => $post['account_name'],//小程序账号名称
                'account_name_type' => $post['account_name_type'],//小程序账号名称命名类型 1：基于自选词汇命名 2：基于商标命名
                'account_supplemental' => $account_supplemental,//称命中关键词-补充材料 media_id 支持jpg,jpeg .bmp.gif .png格式，支持上传多张图片
                'auth_identification' => $post['auth_identification'] ?? '',//认证类型为个人类型时可以选择要认证的身份，从/wxa/sec/authidentitytree 里获取，填叶节点的name
                'auth_ident_material' => $auth_ident_material,//填了auth_identification则必填。身份证明材料 media_id （1）基于不同认证身份上传不同的材料；（2）认证类型=1时选填，支持上传10张图片（3）支持jpg,jpeg .bmp.gif .png格式

                'pay_type' => 2,//支付方式 1：消耗服务商预购包 2：小程序开发者自行支付
                'third_party_phone' => '0379-65555005',//第三方联系电话-0379-65555005
                //'service_appid'=>$service_appid,//选择服务商代缴模式时必填。服务市场appid，该服务市场账号主体必须与服务商账号主体一致
            ]
        ];

        $res = WechatProgramHandle::wxAuth($member_miniapp_id, $params);
        if (!isset($res['errcode']) || $res['errcode'] != 0) {
            $errmsg = $res['errmsg'] ?? '';
            return $this->error('提交认证信息失败:' . $errmsg);
        }

        $data = [
            'member_miniapp_id' => $member_miniapp_id,
            'customer_type' => $post['customer_type'],
            'email' => $post['email'],
            'name' => $post['name'],
            'invoice_type' => $post['invoice_type'],
            'invoice_id' => $post['invoice_id'],
            'invoice_desc' => $post['invoice_desc'],
            'qualification' => $post['qualification'] ?? '',
            //'qualification_other'=> $post['qualification_other']??'',
            'account_name' => $post['account_name'],
            'account_name_type' => $post['account_name_type'],
            'account_supplemental' => json_encode($account_supplemental, JSON_UNESCAPED_UNICODE),
            'pay_type' => 2,
            'auth_identification' => $post['auth_identification'] ?? '',
            'auth_ident_material' => json_encode($auth_ident_material, JSON_UNESCAPED_UNICODE),
            'third_party_phone' => '0379-65555005',
            'service_appid' => '',
            'create_time' => time(),
            'appid' => $appid,

            'taskid' => $res['taskid'] ?? '',
            'auth_url' => $res['auth_url'] ?? '',
            'auth_status' => 1,
        ];
        $wechatAuthInfo = WechatAuthInfo::create($data);

        return $this->success('success');
    }

//    /**
//     * 小程序认证
//     */
//    public function mnAuth()
//    {
//        self::isMemberAppAuth();
//        $member_miniapp_id = $this->member_miniapp_id;
//        $post = $this->request->post();
//
//        //支付方式 1：消耗服务商预购包 2：小程序开发者自行支付
//        $pay_type= 2;
//        //发票类型 1: 不开发票 2: 电子发票 3: ~~增值税专票~~（2024年4月3日起废弃） 4: 增值税专票（数电类型）
//        $invoice_type= $post['invoice_type'];
//        //发票信息，如果是服务商代缴模式，不需要改参数
//        $invoice_info=[];
//        //选择服务商代缴模式时必填。服务市场appid，该服务市场账号主体必须与服务商账号主体一致
//        $service_appid='';
//        if($pay_type == 2){
//            //小程序开发者自行支付
//            if($invoice_type == 2){
//                //需要发票
//                $invoice_info=[
//                    'invoice_type'=>$invoice_type,
//                    'electronic'=>[//发票类型=2时必填 电子发票开票信息
//                        'id'=>$post['electronic_id'],//纳税识别号（15位、17、18或20位）
//                        //'desc'=>$post['electronic_desc']??'',//发票备注（选填）
//                    ]
//                ];
//            }else{
//                //不需要发票
//                $invoice_info=[
//                    'invoice_type'=>$invoice_type,
//                ];
//            }
//        }else{
//            //消耗服务商预购包
//            $service_appid = $post['service_appid'];
//        }
//        if(!$post['name'] ||$post['email']){
//
//        }
//
//
//        //构建请求参数
//        $params = [
//            'auth_data' => [
//                'customer_type' => $post['customer_type'],//企业为1，个体工商户 为12，个人是15
//                'contact_info'=>[
//                    'name'=>$post['name'],//认证联系人姓名
//                    'email'=>$post['email'],//认证联系人邮箱
//                ],
//                'invoice_info'=>$invoice_info,//发票信息，如果是服务商代缴模式，不需要改参数
//                'qualification'=>$post['qualification'],//非个人类型必填。主体资质材料 media_id 支持jpg,jpeg .bmp.gif .png格式，仅支持一张图片
//                //'qualification_other'=>$post['qualification_other'],//数组-主体资质其他证明材料 media_id 支持jpg,jpeg .bmp.gif .png格式，最多上传10张图片
//                'account_name'=>$post['account_name'],//小程序账号名称
//                'account_name_type'=>$post['account_name_type'],//小程序账号名称命名类型 1：基于自选词汇命名 2：基于商标命名
//                'pay_type'=>$pay_type,//支付方式 1：消耗服务商预购包 2：小程序开发者自行支付
//                'third_party_phone'=>$post['third_party_phone'],//第三方联系电话-0379-65555005
//                //'service_appid'=>$service_appid,//选择服务商代缴模式时必填。服务市场appid，该服务市场账号主体必须与服务商账号主体一致
//            ]
//        ];
//
//        $res = WechatProgramHandle::wxAuth($member_miniapp_id,$params);
//        return $this->success('success', $res);
//    }

    /**
     * 小程序认证-重新提交
     */
    public function mnReauth()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;
        $post = $this->request->post();

        if (!isset($post['taskid']) || !$post['taskid']) {
            return $this->error('缺少taskid');
        }
        if (!$post['customer_type'] || !$post['name'] || !$post['email'] || !$post['account_name'] || !$post['account_name_type']) {
            return $this->error('缺少必要参数');
        }
        if (!in_array($post['customer_type'], [1, 12, 15])) {
            return $this->error('类型不存在');
        }
        if (in_array($post['customer_type'], [1, 12])) {
            if (!isset($post['qualification']) || !$post['qualification']) {
                return $this->error('请上传主体资质材料');
            }
        }
        if ($post['customer_type'] == 15) {
            if (!isset($post['auth_identification']) || !$post['auth_identification']) {
                return $this->error('请选择个人身份');
            }
            if (!isset($post['auth_ident_material']) || !$post['auth_ident_material']) {
                return $this->error('请上传身份证明材料');
            }
            if (!is_array($post['auth_ident_material'])) {
                return $this->error('身份证明材料，必须是数组格式');
            }
        }

        //发票类型 1: 不开发票 2: 电子发票 3: ~~增值税专票~~（2024年4月3日起废弃） 4: 增值税专票（数电类型）
        $invoice_type = $post['invoice_type'];
        //小程序开发者自行支付
        if ($invoice_type == 2) {
            //需要发票
            $invoice_info = [
                'invoice_type' => $invoice_type,
                'electronic' => [//发票类型=2时必填 电子发票开票信息
                    'id' => $post['invoice_id'],//纳税识别号（15位、17、18或20位）
                    'desc' => $post['invoice_desc'] ?? '',//发票备注（选填）
                ]
            ];
        } else {
            //不需要发票
            $invoice_info = [
                'invoice_type' => $invoice_type,
            ];
        }

        //根据$appid查询认证记录拦截
        $wechatAuthInfo = WechatAuthInfo::where('taskid', $post['taskid'])->find();
        if (!$wechatAuthInfo) {
            return $this->error('数据不存在');
        }
        if ($wechatAuthInfo['auth_status'] == 1) {
            return $this->error('正在认证审核，请勿重复提交');
        }
        if ($wechatAuthInfo['auth_status'] == 2) {
            return $this->error('已经认证通过');
        }
        if ($wechatAuthInfo['auth_status'] == 4) {
            return $this->error('认证最终失败,不能再修改');
        }

        ////称命中关键词-补充材料 media_id 支持jpg,jpeg .bmp.gif .png格式，支持上传多张图片
        $account_supplemental = $post['account_supplemental'] ?? [];
        //填了auth_identification则必填。身份证明材料 media_id （1）基于不同认证身份上传不同的材料；（2）认证类型=1时选填，支持上传10张图片（3）支持jpg,jpeg .bmp.gif .png格式
        $auth_ident_material = $post['auth_ident_material'] ?? [];
        //构建请求参数
        $params = [
            'auth_data' => [
                'customer_type' => $post['customer_type'],//企业为1，个体工商户 为12，个人是15
                'taskid' => $post['taskid'],//认证任务id，打回重审调用reauth时为必填
                'contact_info' => [
                    'name' => $post['name'],//认证联系人姓名
                    'email' => $post['email'],//认证联系人邮箱
                    'mobile' => $post['mobile'] ?? '',//认证联系人手机号，仅打回重填时可填写
                ],
                'invoice_info' => $invoice_info,//发票信息，如果是服务商代缴模式，不需要改参数
                'qualification' => $post['qualification'] ?? '',//非个人类型必填。主体资质材料 media_id 支持jpg,jpeg .bmp.gif .png格式，仅支持一张图片
                'qualification_other' => $post['qualification_other'] ?? [],//数组-主体资质其他证明材料 media_id 支持jpg,jpeg .bmp.gif .png格式，最多上传10张图片
                'account_name' => $post['account_name'],//小程序账号名称
                'account_name_type' => $post['account_name_type'],//小程序账号名称命名类型 1：基于自选词汇命名 2：基于商标命名
                'account_supplemental' => $account_supplemental,//称命中关键词-补充材料 media_id 支持jpg,jpeg .bmp.gif .png格式，支持上传多张图片
                'auth_identification' => $post['auth_identification'] ?? '',//认证类型为个人类型时可以选择要认证的身份，从/wxa/sec/authidentitytree 里获取，填叶节点的name
                'auth_ident_material' => $auth_ident_material,//填了auth_identification则必填。身份证明材料 media_id （1）基于不同认证身份上传不同的材料；（2）认证类型=1时选填，支持上传10张图片（3）支持jpg,jpeg .bmp.gif .png格式
                'pay_type' => 2,//支付方式 1：消耗服务商预购包 2：小程序开发者自行支付
                'third_party_phone' => '0379-65555005',//第三方联系电话-0379-65555005
                //'service_appid'=>$service_appid,//选择服务商代缴模式时必填。服务市场appid，该服务市场账号主体必须与服务商账号主体一致
            ]
        ];
        $res = WechatProgramHandle::wxReauth($member_miniapp_id, $params);
        if (!isset($res['errcode']) || $res['errcode'] != 0) {
            $errmsg = $res['errmsg'] ?? '';
            return $this->error('重新提交认证信息失败:' . $errmsg);
        }


        $wechatAuthInfo->member_miniapp_id = $member_miniapp_id;
        $wechatAuthInfo->customer_type = $post['customer_type'];
        $wechatAuthInfo->email = $post['email'];
        $wechatAuthInfo->name = $post['name'];
        $wechatAuthInfo->mobile = $post['mobile'] ?? '';
        $wechatAuthInfo->invoice_type = $post['invoice_type'];
        $wechatAuthInfo->invoice_id = $post['invoice_id'];
        $wechatAuthInfo->invoice_desc = $post['invoice_desc'];
        $wechatAuthInfo->qualification = $post['qualification'] ?? '';
        $wechatAuthInfo->account_name = $post['account_name'];
        $wechatAuthInfo->account_name_type = $post['account_name_type'];
        $wechatAuthInfo->account_supplemental = json_encode($account_supplemental, JSON_UNESCAPED_UNICODE);
        $wechatAuthInfo->pay_type = 2;
        $wechatAuthInfo->auth_identification = $post['auth_identification'] ?? '';
        $wechatAuthInfo->auth_ident_material = json_encode($auth_ident_material, JSON_UNESCAPED_UNICODE);
        $wechatAuthInfo->third_party_phone = '0379-65555005';

        $wechatAuthInfo->taskid = $res['taskid'] ?? '';
        $wechatAuthInfo->auth_url = $res['auth_url'] ?? '';
        $wechatAuthInfo->auth_status = 1;
        $wechatAuthInfo->update_time = time();
        $wechatAuthInfo->task_status = 0;
        $wechatAuthInfo->apply_status = 0;
        $wechatAuthInfo->message = '';
        //$wechatAuthInfo->notify_info= '';

        $wechatAuthInfo->save();

        return $this->success('success', $res);
    }

    /**
     * 查询个人认证身份选项列表
     */
    public function mnAuthidentitytree()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;
        $post = $this->request->post();

        //构建请求参数
        $params = [
            //'taskid' => $post['taskid'],
        ];

        $res = WechatProgramHandle::wxAuthidentitytree($member_miniapp_id, $params);
        return $this->success('success', $res);

    }

    /**
     * 小程序认证进度查询
     */
    public function mnQueryAuth()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;
        $post = $this->request->post();

        //构建请求参数
        $params = [
            'taskid' => $post['taskid'],
        ];

        $res = WechatProgramHandle::wxQueryAuth($member_miniapp_id, $params);
        return $this->success('success', $res);

    }

    /**
     * 小程序认证上传补充材料
     */
    public function mnUploadAuthMaterial()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;
        $post = $this->request->post();

        $image = $post['image'];
        //获取文件名
        $filename = basename($image);
        // 目标目录（确保目录存在）
        $uploadDir = root_path() . 'runtime' . DS . 'wxuplode' . DS;
        if (!file_exists($uploadDir)) {
            mkdir($uploadDir, 0755, true);
        }
        // 目标文件路径（目录 + 文件名）
        $local_image = $uploadDir . DS . $filename;
        //合作协议从oss下载到本地
        copy($image, $local_image);

        //构建请求参数
        $params = [
            //待上传的图片或视频的二进制内容
            //'media' => file_get_contents($local_image),
            'media' => $local_image,
        ];
        $res = WechatProgramHandle::wxUploadAuthMaterial($member_miniapp_id, $params);
        if (!isset($res['errcode']) || $res['errcode'] != 0 || !$res['mediaid']) {
            $errmsg = $res['errmsg'] ?? '';
            return $this->error('上传文件失败:' . $errmsg);
        }
        //上传成功后删除本地缓存文件
        if (file_exists($local_image)) {
            unlink($local_image);
        }
        return $this->success('success', $res);

    }

    /**
     * 发起小程序管理员人脸核身
     */
    public function mnCreateIcpVerifyTask()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;
        //构建请求参数
        $params = [
            //'along_with_auth' => false,//小程序认证及备案二合一场景，填 true，否则为小程序备案场景。默认值为 false
        ];
        $res = WechatProgramHandle::wxCreateIcpVerifyTask($member_miniapp_id, $params);
        return $this->success('success', $res);

    }

    /**
     * 查询人脸核身任务状态
     */
    public function mnQueryIcpVerifyTask()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;
        $post = $this->request->post();
        //构建请求参数
        $params = [
            'task_id' => $post['task_id'],//人脸核身任务id，示例值："R5PqRPNb6GmG3i0rqd4pTg"
        ];
        $res = WechatProgramHandle::wxQueryIcpVerifyTask($member_miniapp_id, $params);
        return $this->success('success', $res);

    }

    /**
     * 上传小程序备案媒体材料
     */
    public function mnUploadIcpMedia()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;
        $post = $this->request->post();
        //构建请求参数
        $params = [
            'type' => 'image',//媒体材料类型。目前支持两种：图片("image")和视频("video")，示例值："image"
            'certificate_type' => 2,//证件类型,2=居民身份证
            'icp_order_field' => 'icp_subject.principal_info.certificate_photo_front',//媒体材料所属的备案字段名
            'media' => $post['image'],//待上传的图片或视频的二进制内容
        ];
        $res = WechatProgramHandle::wxUploadIcpMedia($member_miniapp_id, $params);
        return $this->success('success', $res);

    }

    /**
     * 申请小程序备案
     */
    public function mnApplyIcpFiling()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;
        $post = $this->request->post();
        //构建请求参数
        $params = [
            //备案主体信息
            'icp_subject' => [
                //主体基本信息
                'base_info' => [
                    'type' => $post['type'],//主体性质，示例值：4企业
                    'name' => $post['name'],//主办单位名称，示例值："张三"
                    'province' => $post['province'],//备案省份，使用省份代码，示例值："110000"(参考：获取区域信息接口)
                    'city' => $post['city'],//备案城市，使用城市代码，示例值："110100"(参考：获取区域信息接口)
                    'district' => $post['district'],//备案县区，使用县区代码，示例值："110105"(参考：获取区域信息接口)
                    'address' => $post['address'],//通讯地址，必须属于备案省市区，地址开头的省市区不用填入
                    'comment' => $post['comment'] ?? '',//主体信息备注
                ],
                //个人主体额外信息
                'personal_info' => [
                    //临时居住证明照片 media_id，个人备案且非本省人员，需要提供居住证、暂住证、社保证明、房产证等临时居住证明，示例值："4ahCGpd3CYkE6RpkNkUR5czt3LvG8xDnDdKAz6bBKttSfM8p4k5Rj6823HXugPwQBurgMezyib7"
                    'residence_permit' => $post['residence_permit'] ?? '',
                ],
                //主体额外信息（个人备案时，如果存在与主体负责人信息相同的字段，则填入相同的值）
                'organize_info' => [
                    'certificate_type' => $post['certificate_type'],//主体证件类型，示例值：2(参考：获取证件类型接口)
                    'certificate_number' => $post['certificate_number'],//主体证件号码，示例值："110105199001011234"
                    'certificate_address' => $post['certificate_address'],//主体证件住所，示例值："北京市朝阳区高碑店路181号1栋12345室"
                    'certificate_photo' => $post['certificate_photo'] ?? '',//主体证件照片 media_id，如果小程序主体为非个人类型，则必填
                ],
                //主体负责人信息
                'principal_info' => [
                    'name' => $post['master_name'],//负责人姓名
                    'mobile' => $post['master_mobile'],//负责人联系方式
                    'email' => $post['master_email'],//负责人电子邮件
                    'emergency_contact' => $post['master_emergency_contact'],//负责人应急联系方式
                    'certificate_type' => $post['master_certificate_type'],//负责人证件类型，示例值：2(参考：获取证件类型接口，此处只能填入单位性质属于个人的证件类型)
                    'certificate_number' => $post['master_certificate_number'],//负责人证件号码
                    'certificate_validity_date_start' => $post['master_certificate_validity_date_start'],//负责人证件有效期起始日期，格式为 YYYYmmdd，示例值："20230815"
                    'certificate_validity_date_end' => $post['master_certificate_validity_date_end'],//负责人证件有效期终止日期，格式为 YYYYmmdd，如证件长期有效，请填写 "长期"，示例值："20330815"
                    'certificate_photo_front' => $post['master_certificate_photo_front'],//负责人证件正面照片 media_id（身份证为人像面）
                    'certificate_photo_back' => $post['master_certificate_photo_back'],//负责人证件背面照片 media_id（身份证为国徽面）
                    'authorization_letter' => $post['master_authorization_letter'] ?? '',//授权书 media_id，当主体负责人不是法人时需要主体负责人授权书，当小程序负责人不是法人时需要小程序负责人授权书
                    'verify_task_id' => $post['master_verify_task_id'],//扫脸认证任务id(扫脸认证接口返回的task_id)，仅小程序负责人需要扫脸，主体负责人无需扫脸
                ],
                //法人信息（非个人备案，且主体负责人不是法人时，必填）
                'legal_person_info' => [
                    'name' => $post['legal_name'],//法人代表姓名
                    'certificate_number' => $post['legal_certificate_number'],//法人证件号码
                ],
            ],

            //微信小程序信息
            'icp_applets' => [
                //微信小程序基本信息
                'base_info' => [
                    'service_content_types' => $post['base_service_content_types'],//小程序服务内容类型，只能填写二级服务内容类型，最多5个，示例值：[3, 4]
                    'comment' => $post['base_comment'],//请具体描述小程序实际经营内容、主要服务内容，该信息为主管部门审核重要依据，备注内容字数限制20-200字，请认真填写。
                    //前置审批项，列表中不能存在重复的前置审批类型id，如不涉及前置审批项，也需要填“以上都不涉及”
                    'nrlx_details' => $post['nrlx_details'],
                ],
                //小程序负责人信息
                'principal_info' => [
                    'name' => $post['mini_name'],//负责人姓名
                    'mobile' => $post['mini_mobile'],//负责人联系方式
                    'email' => $post['mini_email'],//负责人电子邮件
                    'emergency_contact' => $post['mini_emergency_contact'],//负责人应急联系方式
                    'certificate_type' => $post['mini_certificate_type'],//负责人证件类型，示例值：2(参考：获取证件类型接口，此处只能填入单位性质属于个人的证件类型)
                    'certificate_number' => $post['mini_certificate_number'],//负责人证件号码
                    'typcertificate_validity_date_starte' => $post['mini_typcertificate_validity_date_starte'],//负责人证件有效期起始日期，格式为 YYYYmmdd
                    'certificate_validity_date_end' => $post['mini_certificate_validity_date_end'],//负责人证件有效期终止日期，格式为 YYYYmmdd，如证件长期有效，请填写 "长期"，示例值："20330815"
                    'certificate_photo_front' => $post['mini_certificate_photo_front'],//负责人证件正面照片 media_id（身份证为人像面）
                    'certificate_photo_back' => $post['mini_certificate_photo_back'],//负责人证件背面照片 media_id（身份证为国徽面）
                    'authorization_letter' => $post['authorization_letter']??'',//负责人证件背面照片 media_id（身份证为国徽面）
                    'verify_task_id' => $post['verify_task_id']??'',//负责人证件背面照片 media_id（身份证为国徽面）
                ],
            ],
            //微信小程序信息
            'icp_materials' => [
                'commitment_letter'=>$post['commitment_letter']??[],//互联网信息服务承诺书 media_id，最多上传1个
                'business_name_change_letter'=>$post['business_name_change_letter']??[],//主体更名函 media_id(非个人类型，且发生过更名时需要上传)，最多上传1个
                'party_building_confirmation_letter'=>$post['party_building_confirmation_letter']??[],//党建确认函 media_id，最多上传1个
                'promise_video'=>$post['promise_video']??[],//承诺视频 media_id，最多上传1个
                'authenticity_responsibility_letter'=>$post['authenticity_responsibility_letter']??[],//网站备案信息真实性责任告知书 media_id，最多上传1个
                'authenticity_commitment_letter'=>$post['authenticity_commitment_letter']??[],//小程序备案信息真实性承诺书 media_id，最多上传1个
                'website_construction_proposal'=>$post['website_construction_proposal']??[],//小程序建设方案书 media_id，最多上传1个
                'subject_other_materials'=>$post['subject_other_materials']??[],//主体其它附件 media_id，最多上传10个
                'applets_other_materials'=>$post['applets_other_materials']??[],//小程序其它附件 media_id，最多上传10个
                'holding_certificate_photo'=>$post['holding_certificate_photo']??[],//手持证件照 media_id，最多上传1个
            ]

        ];

        $res = WechatProgramHandle::wxApplyIcpFiling($member_miniapp_id, $params);
        return $this->success('success', $res);

    }

    /**
     * 获取小程序备案状态及驳回原因
     */
    public function mnGetIcpEntranceInfo()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;;

        $res = WechatProgramHandle::wxGetIcpEntranceInfo($member_miniapp_id);
        return $this->success('success', $res);

    }

    /**
     * 获取单位性质
     */
    public function mnQueryIcpSubjectTypes()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;;

        $res = WechatProgramHandle::wxQueryIcpSubjectTypes($member_miniapp_id);
        return $this->success('success', $res);
    }

    /**
     * 获取证件类型
     */
    public function mnQueryIcpCertificateTypes()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;;

        $res = WechatProgramHandle::wxQueryIcpCertificateTypes($member_miniapp_id);
        return $this->success('success', $res);
    }

    /**
     * 获取区域信息
     */
    public function mnQueryIcpDistrictCode()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;;

        $res = WechatProgramHandle::wxQueryIcpDistrictCode($member_miniapp_id);
        return $this->success('success', $res);

    }

    /**
     * 获取小程序用户隐私保护指引
     */
    public function mnGetPrivacySetting()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;
        $post = $this->request->post();

        //构建请求参数
        $params = [
            'privacy_ver' => $post['privacy_ver'] ?? 2,//1表示现网版本，即，传1则该接口返回的内容是现网版本的；2表示开发版，即，传2则该接口返回的内容是开发版本的。默认是2
        ];
        $data = WechatProgramHandle::wxGetPrivacySetting($member_miniapp_id, $params);

        $is_privacy_setting = 0;
        $privacy_name = "";
        if ($data && isset($data['setting_list'])) {
            foreach ($data['setting_list'] as $item){
                $item['privacy_text'] = '';
                if ($item['privacy_text'] == '') {
                    $is_privacy_setting = 1;

                    if (isset($data['privacy_desc']['privacy_desc_list'])){
                        foreach ($data['privacy_desc']['privacy_desc_list'] as $item2){
                            if($item2['privacy_key'] == $item['privacy_key']){
                                if($privacy_name){
                                    $privacy_name = $privacy_name.','.$item2['privacy_key'].$item2['privacy_desc'];
                                }else{
                                    $privacy_name = $item2['privacy_key'].$item2['privacy_desc'];
                                }
                                break;
                            }
                        }
                    }

                }
            }
        }
        $data['is_privacy_setting'] = $is_privacy_setting;
        if($privacy_name){
            $data['privacy_name'] = '要收集的用户信息配置有：' . $privacy_name;
        }

        return $this->success('success', $data);
    }

    /**
     * 设置小程序用户隐私保护指引
     */
    public function mnSetPrivacySetting()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;
        $post = $this->request->post();
        $privacy_ver = $post['privacy_ver'] ?? 2;//用户隐私保护指引的版本，1表示现网版本；2表示开发版。默认是2开发版。

        $params = [];
        //要收集的用户信息配置，可选择的用户信息类型参考下方详情。当privacy_ver传2或者不传时，setting_list是必填；当privacy_ver传1时，该参数不可传，否则会报错
        if ($privacy_ver == 2) {
            if (!isset($post['setting_list'])) {
                return $this->error('缺少必要字段setting_list');
            }
            if (!is_array($post['setting_list'])) {
                return $this->error('setting_list必须是一个数组');
            }

            foreach ($post['setting_list'] as $setting) {
                if (empty($setting['privacy_key']) || empty($setting['privacy_text'])) {
                    return $this->error('setting_list数组缺少必要字段privacy_key和privacy_text');
                }
            }
            $params['setting_list'] = $post['setting_list'];
        }

        //该小程序中引用了第三方sdk的信息说明
        if (isset($post['sdk_privacy_info_list'])) {
            if (!is_array($post['sdk_privacy_info_list'])) {
                return $this->error('sdk_privacy_info_list必须是一个数组');
            }
            foreach ($post['sdk_privacy_info_list'] as $sdkInfo) {
                if (empty($sdkInfo['sdk_name']) || empty($sdkInfo['sdk_biz_name']) || empty($sdkInfo['sdk_list'])) {
                    return $this->error('sdk_privacy_info_list数组缺少必要字段sdk_name、sdk_biz_name和sdk_list');
                }
                foreach ($sdkInfo['sdk_list'] as $sdkItem) {
                    if (empty($sdkItem['privacy_key']) || empty($sdkItem['privacy_text'])) {
                        return $this->error('sdk_list数组缺少必要字段privacy_key和privacy_text');
                    }
                }
            }
            $params['sdk_privacy_info_list'] = $post['sdk_privacy_info_list'];
        }

        if (!isset($post['contact_phone']) || !isset($post['contact_phone']) || !isset($post['contact_phone']) || !isset($post['contact_phone'])) {
            return $this->error('4种联系方式至少要填一种');
        }

        $store_expire_timestamp = '';
        if (isset($post['store_expire_timestamp']) && $post['store_expire_timestamp']) {
            $store_expire_timestamp = $post['store_expire_timestamp'] . '天';
        }

        //收集方（开发者）信息配置
        $params['owner_setting'] = [
            'contact_phone' => $post['contact_phone'] ?? '',//息收集方（开发者）的手机号，4种联系方式至少要填一种
            'contact_email' => $post['contact_email'] ?? '',//信息收集方（开发者）的手机号，4种联系方式至少要填一种
            'contact_qq' => $post['contact_qq'] ?? '',//信息收集方（开发者）的手机号，4种联系方式至少要填一种
            'contact_weixin' => $post['contact_weixin'] ?? '',//信息收集方（开发者）的手机号，4种联系方式至少要填一种
            'store_expire_timestamp' => $store_expire_timestamp,//存储期限，指的是开发者收集用户信息存储多久。如果不填则展示为【开发者承诺，除法律法规另有规定，开发者对你的信息保存期限应当为实现处理目的所必要的最短时间】，
            'ext_file_media_id' => $post['ext_file_media_id'] ?? '',//如果开发者不使用微信提供的标准化用户隐私保护指引模板，也可以上传自定义的用户隐私保护指引，通过uploadPrivacySetting接口上传后可获取media_id
            'notice_method' => $post['notice_method'] ?? '',//通知方式，指的是当开发者收集信息有变动时，通过该方式通知用户。这里服务商需要按照实际情况填写，例如通过弹窗或者公告或者其他方式。
            'store_region' => $post['store_region'] ?? '',//存储地区；境外主体小程序需要补充「用户隐私保护指引」中「存储地区」的相关信息，否则小程序审核会被驳回。
        ];


        $res = WechatProgramHandle::wxSetPrivacySetting($member_miniapp_id, $params);
        return $this->success('success', $res);

    }

    /**
     * 获取隐私接口检测结果
     */
    public function mnGetCodePrivacyInfo()
    {
        self::isMemberAppAuth();
        $member_miniapp_id = $this->member_miniapp_id;

        $res = WechatProgramHandle::wxGetCodePrivacyInfo($member_miniapp_id);
        return $this->success('success', $res);

    }

}